package com.fancy.projecty.N设置流程变量;

import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.HashMap;
import java.util.Map;

/**
 * 案例:ZJJ_Activiti_2020/01/07_11:46:06_acg9p
 * 通过当前任务id设置流程变量,
 * 需要注意,当前任务必须还在进行中,
 * 任务ID必须要在act_ru_task 表里面存在
 * 如果当前任务已经结束,你再设置值就会报错了
 * 和 任务办理时设置流程变量是差不多一样,只是绑定流程变量的时间节点不一样而已
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class D_通过当前任务id设置流程变量 {


	/*历史记录的查询*/
	@Autowired
	private HistoryService historyService;


	@Autowired
	/*管理流程定义,部署相关的Service*/
	private RepositoryService repositoryService;


	@Autowired
	/*执行管理、包括启动、推进、删除流程实例等操作*/
	private RuntimeService runtimeService;


	@Autowired
	/*任务管理,可以做任务的查询的*/
	private TaskService taskService;

	@Test
	public void c_赵六完成自己的任务() {
		Task task = this.taskService.createTaskQuery().processDefinitionKey("holiday4").taskAssignee("zhaoliu").singleResult();
		if (task != null) {
			this.taskService.complete(task.getId());
			System.err.println("赵六的任务完成了. ");
		} else {
			System.err.println("赵六没有任务");
		}

	}

	/**
	 * 王五完成自己的任务
	 */
	@Test
	public void c_王五完成自己的任务() {
		Task task = this.taskService.createTaskQuery().processDefinitionKey("holiday4").taskAssignee("wangwu").singleResult();
		if (task != null) {
			this.taskService.complete(task.getId());
			System.err.println("王五的任务完成了. ");
		} else {
			System.err.println("王五没有任务. ");
		}

	}


	/**
	 * 李四完成自己的任务
	 * 同时设置流程变量
	 */
	@Test
	public void c_李四完成自己的任务() {
		Task task = this.taskService.createTaskQuery().processDefinitionKey("holiday4").taskAssignee("lisi").singleResult();
		if (task != null) {

			this.taskService.complete(task.getId());
			System.err.println("李四的任务完成了. ");
		} else {
			System.err.println("李四没有任务...");
		}

	}


	@Test
	public void c_张三完成自己的任务() {
		Task task = this.taskService.createTaskQuery().processDefinitionKey("holiday4").taskAssignee("zhangsan").singleResult();
		if (task != null) {
			this.taskService.complete(task.getId());
			System.err.println("张三的任务完成了. ");
		} else {
			System.err.println("张三没有任务");
		}

	}

	@Test
	public void c_根据任务id设置流程变量() {
		Task task = this.taskService.createTaskQuery().processDefinitionKey("holiday4").taskAssignee("zhangsan").singleResult();
		if (task != null) {
			String id = task.getId();
			//  根据任务id设置流程变量的值
			this.taskService.setVariable(id, "num", 2);
			System.err.println("已经根据任务id设置完了流程变量了");
		} else {
			System.err.println("张三没有任务");
		}
	}


	/**
	 * 启动流程实例
	 */
	@Test
	public void c_启动流程实例() {
// 定义流程变量
		Map<String, Object> variables = new HashMap<String, Object>();

		variables.put("assignee1", "zhangsan");
		variables.put("assignee2", "lisi");
		variables.put("assignee3", "wangwu");
		variables.put("assignee4", "zhaoliu");
		ProcessInstance holiday4 = this.runtimeService.startProcessInstanceByKey("holiday4", variables);
		System.out.println("流 程 实 例 id:" + holiday4.getProcessInstanceId());


	}

	/**
	 * 部署流程实例
	 */
	@Test
	public void c_部署流程实例() {
		Deployment deploy = this.repositoryService.createDeployment()
				.addClasspathResource("diagram/holiday4.bpmn")
				.name("请假流程,流程变量")
				.deploy();
		String id = deploy.getId();
		System.out.println("部署成功,id = " + id);//25001


	}

	@Test
	public void c_删除流程实例() {
		this.repositoryService.deleteDeployment("22501");


	}


}
